package net.jcip.examples.chapter8;

import java.util.concurrent.*;

/**
 * CompletionService 是 Java 并发编程中的一个接口，用于管理异步任务的执行结果。它允许你提交一组任务，并在任务完成时按照它们完成的顺序获取结果，而不需要显式地管理 Future 对象。
 *
 * 主要特点和用途：
 * 提交任务：你可以通过 submit() 方法将任务提交给 CompletionService，任务可以是 Callable 或 Runnable 类型。
 *
 * 异步执行：CompletionService 将提交的任务放入内部的队列中，并由内部的工作者线程池执行这些任务，每个任务执行完成后将结果保存在 Future 中。
 *
 * 获取结果：通过 take() 或 poll() 方法获取已完成的任务的结果。这些方法会阻塞直到有任务完成并返回结果。
 *
 * 简化管理：相比手动管理 Future 对象的集合，CompletionService 可以简化对任务结果的管理和处理，特别是在需要按照任务完成顺序处理结果时更为方便。
 */
public class CompletionServiceExample {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newCachedThreadPool();

        CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor);

        // Submit tasks
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            completionService.submit(() -> {
                Thread.sleep(taskId * 1000); // Simulate some computation time
                return taskId;
            });
        }

        // Retrieve results in completion order
        for (int i = 0; i < 10; i++) {
            Future<Integer> result = completionService.take(); // Blocking until a task completes
            Integer taskId = result.get(); // Get the result of the completed task
            System.out.println("Task " + taskId + " completed");
        }

        executor.shutdown();
    }
}
